/**
 * Copyright: Copyright 2018 Tsingmirco Inc
 * Author: hytrao
 * Date: 2022-02-14
 * Description:
 *  1. 实现了工具栏的按钮样式
 */

#ifndef MENUBUTTON_H
#define MENUBUTTON_H

#include <QPixmap>
#include <QToolButton>
#ifdef TSING_HC
class Q_DECL_EXPORT MenuButton : public QToolButton
#else
class MenuButton : public QToolButton
#endif
{
  Q_OBJECT
  Q_ENUMS(TextAlign)
  Q_ENUMS(TrianglePosition)
  Q_ENUMS(IconPosition)
  Q_ENUMS(LinePosition)

  Q_PROPERTY(int paddingLeft READ getPaddingLeft WRITE setPaddingLeft)
  Q_PROPERTY(int paddingRight READ getPaddingRight WRITE setPaddingRight)
  Q_PROPERTY(int paddingTop READ getPaddingTop WRITE setPaddingTop)
  Q_PROPERTY(int paddingBottom READ getPaddingBottom WRITE setPaddingBottom)
  Q_PROPERTY(TextAlign textAlign READ getTextAlign WRITE setTextAlign)

 public:
  enum TextAlign {
    TextAlign_Left = 0x0001,    // 左侧对齐
    TextAlign_Right = 0x0002,   // 右侧对齐
    TextAlign_Top = 0x0020,     // 顶部对齐
    TextAlign_Bottom = 0x0040,  // 底部对齐
    TextAlign_Center = 0x0004   // 居中对齐
  };

  enum TrianglePosition {
    TrianglePosition_Left = 0,   // 左侧
    TrianglePosition_Right = 1,  // 右侧
    TrianglePosition_Top = 2,    // 顶部
    TrianglePosition_Bottom = 3  // 底部
  };

  enum IconPosition {
    IconPosition_Left = 0,   // 左侧
    IconPosition_Right = 1,  // 右侧
    IconPosition_Top = 2,    // 顶部
    IconPosition_Bottom = 3  // 底部
  };

  enum LinePosition {         // 边框线条位置
    LinePosition_Left = 0,    // 左侧
    LinePosition_Right = 1,   // 右侧
    LinePosition_Top = 2,     // 顶部
    LinePosition_Bottom = 3,  // 底部
    LinePosition_None = 4     // 无
  };

 public:
  MenuButton(QWidget *parent = nullptr);

 public:  // 获取相应设置的值
  int getPaddingLeft() const;
  int getPaddingRight() const;
  int getPaddingTop() const;
  int getPaddingBottom() const;
  TextAlign getTextAlign() const;

  bool getShowTriangle() const;
  int getTriangleLen() const;
  TrianglePosition getTrianglePosition() const;
  QColor getTriangleColor() const;

  bool getShowIcon() const;
  int getIconSpace() const;
  QSize getIconSize() const;
  QPixmap getIconNormal() const;
  QPixmap getIconHover() const;
  QPixmap getIconCheck() const;

  bool getShowLine() const;
  int getLineSpace() const;
  int getLineWidth() const;
  LinePosition getLinePosition() const;
  QColor getLineColor() const;

  QColor getNormalBgColor() const;
  QColor getHoverBgColor() const;
  QColor getCheckBgColor() const;
  QColor getNormalTextColor() const;
  QColor getHoverTextColor() const;
  QColor getCheckTextColor() const;

  // 设置文字间隔
  void setPaddingLeft(int paddingLeft);
  void setPaddingRight(int paddingRight);
  void setPaddingTop(int paddingTop);
  void setPaddingBottom(int paddingBottom);
  void setPadding(int padding);
  void setPadding(int paddingLeft, int paddingRight, int paddingTop,
                  int paddingBottom);

  // 设置文字对齐
  void setTextAlign(const TextAlign &textAlign);
  // 设置显示倒三角
  void setShowTriangle(bool bShowTriangle);
  // 设置倒三角边长
  void setTriangleLen(int triangleLen);
  // 设置倒三角位置
  void setTrianglePosition(const TrianglePosition &trianglePosition);
  // 设置倒三角颜色
  void setTriangleColor(const QColor &triangleColor);

  // 设置显示图标
  void setShowIcon(bool showIcon);
  // 设置图标间隔
  void setIconSpace(int iconSpace);
  // 设置图标尺寸
  void setIconSize(const QSize &iconSize);
  // 设置正常图标
  void setIconNormal(const QPixmap &iconNormal);

  // 设置灰色图标
  void setIconUnused(const QPixmap &iconUnused);

  // 设置悬停图标
  void setIconHover(const QPixmap &iconHover);
  // 设置按下图标
  void setIconCheck(const QPixmap &iconCheck);

  // 设置显示边框线条
  void setShowLine(bool bShowLine);
  // 设置线条间隔
  void setLineSpace(int nLineSpace);
  // 设置线条宽度
  void setLineWidth(int nLineWidth);
  // 设置线条位置
  void setLinePosition(const LinePosition &linePosition);
  // 设置线条颜色
  void setLineColor(const QColor &lineColor);

  // 设置正常背景颜色
  void setNormalBgColor(const QColor &normalBgColor);

  // 设置灰色背景颜色
  void setUnenableBgColor(const QColor &unenableBgColor);

  // 设置悬停背景颜色
  void setHoverBgColor(const QColor &hoverBgColor);
  // 设置选中背景颜色
  void setCheckBgColor(const QColor &checkBgColor);

  // 设置正常文字颜色
  void setNormalTextColor(const QColor &normalTextColor);
  // 设置悬停文字颜色
  void setHoverTextColor(const QColor &hoverTextColor);
  // 设置选中文字颜色
  void setCheckTextColor(const QColor &checkTextColor);

  // 设置正常背景画刷
  void setNormalBgBrush(const QBrush &normalBgBrush);
  // 设置悬停背景画刷
  void setHoverBgBrush(const QBrush &hoverBgBrush);
  // 设置选中颜色画刷
  void setCheckBgBrush(const QBrush &checkBgBrush);

 public:
  QSize sizeHint() const override;  // 设置窗口的初始大小
  QSize minimumSizeHint() const override;

 protected:
  // void enterEvent(QEvent *) override;
  void leaveEvent(QEvent *) override;
  void paintEvent(QPaintEvent *) override;

 protected:
  void drawBg(QPainter *painter);        // 绘制背景
  void drawText(QPainter *painter);      // 绘制文字
  void drawIcon(QPainter *painter);      // 绘制图标
  void drawLine(QPainter *painter);      // 绘制标志线
  void drawTriangle(QPainter *painter);  // 绘制倒三角

 private:
  int m_nPaddingLeft;     // 文字左侧间隔
  int m_nPaddingRight;    // 文字右侧间隔
  int m_nPaddingTop;      // 文字顶部间隔
  int m_nPaddingBottom;   // 文字底部间隔
  TextAlign m_textAlign;  // 文字对齐方式

  bool m_bShowTriangle;                 // 显示倒三角
  int m_nTriangleLen;                   // 倒三角边长
  TrianglePosition m_trianglePosition;  // 倒三角位置
  QColor m_triangleColor;               // 倒三角颜色

  bool m_bShowIcon;         // 显示图标
  int m_nIconSpace;         // 图标间隔
  QSize m_iconSize;         // 图标尺寸
  QPixmap m_pixIconNormal;  // 正常图标
  QPixmap m_pixIconUnused;  // 灰色图标

  QPixmap m_pixIconHover;  // 悬停图标
  QPixmap m_pixIconCheck;  // 选中图标

  bool m_bShowLine;             // 显示线条
  int m_nLineSpace;             // 线条间隔
  int m_nLineWidth;             // 线条宽度
  LinePosition m_linePosition;  // 线条位置
  QColor m_lineColor;           // 线条颜色

  QColor m_normalBgColor;    // 正常背景颜色
  QColor m_unusedBgColor;    // 正常背景颜色
  QColor m_hoverBgColor;     // 悬停背景颜色
  QColor m_checkBgColor;     // 选中背景颜色
  QColor m_normalTextColor;  // 正常文字颜色
  QColor m_hoverTextColor;   // 悬停文字颜色
  QColor m_checkTextColor;   // 选中文字颜色

  QBrush m_normalBgBrush;  // 正常背景画刷
  QBrush m_hoverBgBrush;   // 悬停背景画刷
  QBrush m_checkBgBrush;   // 选中背景画刷

  bool m_bHover;  // 悬停标志位
};

#endif  // MENUBUTTON_H
